/*
 * Nivel.cpp
 *
 *  Created on: 16/09/2012
 *      Author: Administrador
 */

#include "Nivel.h"
#include "Personaje.h"
#include "Plataforma.h"
#include "Escalera.h"
#include <stdlib.h>
#include <iostream>
using namespace std;


Nivel::Nivel(){
}

Nivel::~Nivel(){
}

int Nivel::getAlto() const {
	return alto;
}

void Nivel::setAlto(int alto) {
	this->alto = alto;
}

int Nivel::getAncho() const {
	return ancho;
}

void Nivel::setAncho(int ancho) {
	this->ancho = ancho;
}

list<Escalera*>& Nivel::getEscaleras(){
	return escaleras;
}

void Nivel::setEscaleras(const list<Escalera*>& escaleras) {
	this->escaleras = escaleras;
}

const string& Nivel::getPathFondo() const {
	return pathFondo;
}

void Nivel::setPathFondo(const string& pathFondo) {
	this->pathFondo = pathFondo;
}

list<Personaje*>& Nivel::getPersonajes(){
	return personajes;
}

void Nivel::setPersonajes(const list<Personaje*>& personajes) {
	this->personajes = personajes;
}

list<Plataforma*>& Nivel::getPlataformas(){
	return plataformas;
}

void Nivel::setPlataformas(const list<Plataforma*>& plataformas) {
	this->plataformas = plataformas;
}

void Nivel::setDimensiones(int alt, int anch){
	this->alto = alt;
	this->ancho = anch;
}

void Nivel::imprimirNivel(){

	cout << "\nAlto: " << this->getAlto();
	cout << "\nAncho: " << this->getAncho();
	cout << "\nFondo:" << this->getPathFondo();
	cout << "\nPersonajes:" << endl;
	list<Personaje*>::iterator itPersonajes = this->getPersonajes().begin();
	while ( itPersonajes!= this->getPersonajes().end()){
		cout << "\nNombre: " << (*itPersonajes)->getTipoPersonaje()->getNombre();
		cout << "\nAlto: " << (*itPersonajes)->getAlto();
		cout << "\nAncho: " << (*itPersonajes)->getAncho();
		cout << "\nX: " <<(*itPersonajes)->getPosicionX();
		cout << "\nY: " <<(*itPersonajes)->getPosicionY();
		itPersonajes++;
	}

	list<Plataforma*>::iterator itPlataformas = this->getPlataformas().begin();
	while ( itPlataformas!= this->getPlataformas().end()){
		cout << "\nTextura: " << (*itPlataformas)->getTextura()->getNombre();
		cout << "\nAlto: " << (*itPlataformas)->getAlto();
		cout << "\nAncho: " << (*itPlataformas)->getAncho();
		cout << "\nX: " << (*itPlataformas)->getPosicionX();
		cout << "\nY: " << (*itPlataformas)->getPosicionY();
		itPlataformas++;
	}

	list<Escalera*>::iterator itEscaleras = this->getEscaleras().begin();
	while (itEscaleras!= this->getEscaleras().end()){
		cout << "\nTextura: " << (*itEscaleras)->getTextura()->getNombre();
		cout << "\nAlto: " << (*itEscaleras)->getAlto();
		cout << "\nAncho: " << (*itEscaleras)->getAncho();
		cout << "\nX: " << (*itEscaleras)->getPosicionX();
		cout << "\nY: " << (*itEscaleras)->getPosicionY();
		itEscaleras++;
	}

}


void Nivel::setPiso(int pisoNivel){
	this->pisoNivel= pisoNivel;
}

int Nivel::getPiso(){
	return this->pisoNivel;
}


void Nivel::setProtagonista(Personaje* p){

	/*validar que sea parte de los personajes elegibles en el nivel*/
	this->personajes.push_front(p);
}

/**
 *
 */
Personaje *Nivel::getPersonaje(string nombre) {
	list<Personaje*>::const_iterator it;
	for (it = getPersonajes().begin(); it != getPersonajes().end(); ++it) {
		if ( _stricmp( (*it)->getTipoPersonaje()->getNombre().c_str(), nombre.c_str() ) == 0 ) {
			return (*it);
		}
	}
	return NULL;
}

/**
 *
 */
int Nivel::getCantidadPersonajes() {
	int contador = 0;

	list<Personaje*>::iterator itPersonajes;
	for ( itPersonajes = getPersonajes().begin(); itPersonajes != getPersonajes().end(); itPersonajes++ ) {
		if ( (*itPersonajes)->getTipoPersonaje()->getVelocidad() != 0 ) {
			contador++;
		}
	}
	return contador;
}

void Nivel::limpiarPersonajes(string nombre) {
	list<Personaje*>::iterator itPersonajes;
	itPersonajes = getPersonajes().begin();
	while ( itPersonajes != getPersonajes().end() ) {
		if ( (*itPersonajes)->getTipoPersonaje()->getVelocidad() > 0 &&
				_stricmp( (*itPersonajes)->getTipoPersonaje()->getNombre().c_str(), nombre.c_str() ) != 0 ) {
			itPersonajes = getPersonajes().erase(itPersonajes);
		} else {
			itPersonajes++;
		}
	}
}
